package nl.Viewer.ViewManager.Models.ParameterStores;

import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;

import nl.Viewer.SerializedObjects.Parameter;
import nl.Viewer.SerializedObjects.ParameterValue;

/**
 * In a MVC (Model-View-Controller) framework a Model contains the actual data and its operations. This ParameterModel
 * class is the implementation of the model for all session parameters
 * 
 * @author Jeroen Verschuur
 * 
 */

public class ParameterModel {
   // client-accessible parameters
   protected ConcurrentHashMap<String, Parameter> parameters;
   private boolean                                needsRender = false;

   public ParameterModel() {
      parameters = new ConcurrentHashMap<String, Parameter>();
   }

   public synchronized void cleanup() {
      parameters.clear();
      parameters = null;
   }

   public void setParameters( ArrayList<Parameter> params ) {
      for( Parameter p : params ) {
         parameters.put( p.getParameterName(), p );
      }
   }

   public Parameter getParameter( String parameterName ) {
      if( parameters != null ) {
         return parameters.get( parameterName );
      }
      return null;
   }

   public synchronized ArrayList<Parameter> getParameterSnapshot() {
      ArrayList<Parameter> newParameters = new ArrayList<Parameter>();
      if( parameters != null ) {
         for( Parameter p : parameters.values() ) {
            if( p.isModified() && p.isUserModifiable() ) {
               newParameters.add( p );
               p.setModified( false );
               // System.out.println( "snapshot, ChangedParameter: " + p.hashCode() + ": " + p );
            }
         }
      }
      return newParameters;
   }

   public synchronized ConcurrentHashMap<String, Parameter> getParameters() {
      return parameters;
   }

   public synchronized ArrayList<Parameter> updateParameterValues( ArrayList<ParameterValue> parameterValues,
         boolean updateRequiresRender ) {
      ArrayList<Parameter> updatedParameters = new ArrayList<Parameter>();
      for( ParameterValue pv : parameterValues ) {
         Parameter p = parameters.get( pv.parameterName );
         if( p != null ) { // p is null with parameter 'DataObject' for example
            p.setParameterValue( pv.value );
            updatedParameters.add( p );
         }
      }
      if( parameterValues.size() > 0 ) {
         needsRender = needsRender | updateRequiresRender;
      }
      return updatedParameters;
   }

   public synchronized void addParameter( Parameter p ) {
      parameters.put( p.getParameterName(), p );
   }

   public synchronized void setAllParametersModified() {
      for( Parameter p : parameters.values() ) {
         p.setModified( true );
      }
   }

}
